package com.chatmcp.mcprouter.dto;

import com.chatmcp.mcprouter.model.ServerLog;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 代理信息DTO
 * 用于存储和传输MCP代理请求和响应信息
 * 与Go实现的ProxyInfo完全对齐
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ProxyInfoDto {

    /**
     * JSONRPC版本
     */
    private String jsonrpcVersion;

    /**
     * 协议版本
     */
    private String protocolVersion;

    /**
     * 连接时间
     */
    private LocalDateTime connectionTime;

    /**
     * 客户端名称
     */
    private String clientName;

    /**
     * 客户端版本
     */
    private String clientVersion;

    /**
     * 请求方法
     */
    private String requestMethod;

    /**
     * 请求参数
     */
    private Object requestParams;

    /**
     * 请求ID
     */
    private Object requestId;

    /**
     * 请求时间
     */
    private LocalDateTime requestTime;

    /**
     * 请求来源
     */
    private String requestFrom;

    /**
     * 会话ID
     */
    private String sessionId;

    /**
     * 服务器UUID
     */
    private String serverUuid;

    /**
     * 服务器键名
     */
    private String serverKey;

    /**
     * 服务器配置名称
     */
    private String serverConfigName;

    /**
     * 是否共享进程
     */
    private Boolean serverShareProcess;

    /**
     * 服务器类型
     */
    private String serverType;

    /**
     * 服务器URL
     */
    private String serverUrl;

    /**
     * 服务器命令
     */
    private String serverCommand;

    /**
     * 服务器命令哈希
     */
    private String serverCommandHash;

    /**
     * 服务器名称
     */
    private String serverName;

    /**
     * 服务器版本
     */
    private String serverVersion;

    /**
     * 响应时间
     */
    private LocalDateTime responseTime;

    /**
     * 响应结果
     */
    private Object responseResult;

    /**
     * 响应错误
     */
    private Object responseError;

    /**
     * 处理耗时（毫秒）
     */
    private Long costTime;

    /**
     * MCP服务器ID，用于转发请求
     * 注意：这是Java版本特有的字段，Go版本没有
     */
    private String mcpServerId;

    /**
     * 计算处理耗时
     * 如果请求时间和响应时间都不为空，计算处理耗时
     */
    public void calculateCostTime() {
        if (requestTime != null && responseTime != null) {
            costTime = java.time.Duration.between(requestTime, responseTime).toMillis();
        }
    }

    /**
     * 转换为ServerLog实体
     * 确保所有字段都被正确转换
     *
     * @return ServerLog实体
     */
    public ServerLog toServerLog() {
        return ServerLog.builder()
                .sessionId(sessionId)
                .requestId(requestId != null ? requestId.toString() : null)
                .requestFrom(requestFrom)
                .serverUuid(serverUuid)
                .serverKey(serverKey)
                .serverName(serverName)
                .serverVersion(serverVersion)
                .serverConfigName(serverConfigName)
                .serverShareProcess(serverShareProcess)
                .serverType(serverType)
                .serverUrl(serverUrl)
                .serverCommand(serverCommand)
                .serverCommandHash(serverCommandHash)
                .mcpServerId(mcpServerId)
                .clientName(clientName)
                .clientVersion(clientVersion)
                .protocolVersion(protocolVersion)
                .jsonrpcVersion(jsonrpcVersion)
                .requestMethod(requestMethod)
                .requestParams(requestParams != null ? requestParams.toString() : null)
                .responseResult(responseResult != null ? responseResult.toString() : null)
                .responseError(responseError != null ? responseError.toString() : null)
                .connectionTime(connectionTime)
                .requestTime(requestTime)
                .responseTime(responseTime)
                .costTime(costTime)
                .build();
    }
} 